package object4.package7;
//浅拷贝与深拷贝
//一般浅拷贝可以解决大部分问题，而且就算使用深拷贝，也有比递归调用clone更简单的方法
public class Person implements Cloneable {
    private int id;

    private Money money = new Money();

    @Override
    public Person clone() throws CloneNotSupportedException {
        //浅拷贝
        //return (Person) super.clone();
        //深拷贝()
        Person p = (Person) super.clone();
        p.money = p.money.clone();
        return p;
        //此处Person中只有一个引用类型的成员，只需要针对Money再克隆一下
        //如果Person还有其他引用类型，有几个，就要克隆几个
        //包括Money内部，可能也有一些引用类型的成员，也是需要对应clone
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person();
        p1.id = 1;
        p1.money.setAmount(1000);

        Person p2 = p1.clone();
//        System.out.println(p2.id);
//        System.out.println(p2.money.getAmount());
//
//        //修改p2的id
//        p2.id = 2;
//        System.out.println(p1.id);
//        System.out.println(p2.id);

        //修改p2的money,会发现都被更改了,(浅拷贝)相当于只是拷贝了Person,而Person内部持有的money对象,没有真正拷贝
       p2.money.setAmount(2000);
        System.out.println(p1.money.getAmount());
        System.out.println(p2.money.getAmount());
        System.out.println(p1.money == p2.money);
        //虽然p1和p2指向了两个不同的对象,但是p1.money和p2.money仍然是同一个对象
        //因为是引用,p1和p2中存的是money的地址,改动的话,相当于改到了Money储存的空间
    }
    //深拷贝则表示不光要把Person对象本身进行拷贝,还要把Person内部持有的引用类型的属性,也进行拷贝
    //保证内部所有特有的引用类型,都对应拷贝一份新的
}

